/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Archivo: 
 * Última Revision: $Rev: 66 $
 *      Fecha: $Date: 2011-09-18 16:14:18 +0000 (Sun, 18 Sep 2011) $
 */

package Manejo.Transporte.Registros;

import Archivador.iArchivable;


/**
 *Esta clase representa un identificador para cualquier objeto.
 * @author Jorge Martinez
 * @author Jonathan Lopez
 */
public class ID implements iArchivable
{
    private final int serie;
    private final int discriminante;
    
    /**
     * 
     */
    public static final ID idNulo = new ID( 0,0 );
    
    /**
     * Constructor: crea una nueva instancia de ID
     * @param serie numero de serie del ID, contiguo
     * @param discriminante numero aleatorio que diferencia dos ID en caso
     * de suceder alguna anomalía
     */
    ID( int serie, int discriminante )
    {
        this.serie = serie;
        this.discriminante = discriminante;
    }

    /**
     * Compara dos ID y determina si son iguales
     * @param obj ID con el cual compararlo
     * @return true si son iguales, false si son diferentes
     */
    @Override
    public boolean equals(Object obj)
    {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ID other = (ID) obj;
        if (this.serie != other.serie) {
            return false;
        }
        if (this.discriminante != other.discriminante) {
            return false;
        }
        return true;
    }

    /**
     * Crea un hash único para esta clase
     * @return hash
     */
    @Override
    public int hashCode()
    {
        int hash = 7;
        hash = 67 * hash + this.serie;
        hash = 67 * hash + this.discriminante;
        return hash;
    }

    /**
     * Regresa una representación en String de la clase
     * @return String
     */
    @Override
    public String toString()
    {
        return serie + "|" + discriminante;
    }
    
    /**
     * Implementación de la interface iArchivable para guardar IDs como texto plano
     * @return String con la representacion en texto de la instancia
     */
    @Override
    public String guardar()
    {
        return serie + "|" + discriminante;
    }
    
    /**
     * Genera un nuevo ID a partir del String generado por guardar()
     * @param linea
     * @return 
     */
    public static ID parseID( String linea )
    {
        // Validar
        if( linea.length() == 0 )
            return idNulo;
        
        if( !linea.contains( "|" ) )
            return idNulo;
        
        String[] partes = linea.split( "\\|" );
        if( partes.length != 2 )
            return idNulo;
        
        int serie = Integer.parseInt(partes[0]);
        int discriminante = Integer.parseInt(partes[1]);
        
        return new ID( serie, discriminante );
    }
    
    /**
     * Punto de entrada para probar la clase ID. Prueba en su mayoría
     * la implementación de archivador.
     * @param args 
     */
    public static void main( String[] args ){
        // Genera e imprime varios IDs
        System.out.println("**PRUEBA: ID**");
        final int pruebas = 10;
        ID[] ids = new ID[pruebas];
        String[] parses = new String[pruebas];
        
        for( int n = 0; n != pruebas; ++n ){
            ids[n] = GeneradorID.nuevoID();
            System.out.print(ids[n]);
            System.out.print(" & ");
            
            parses[n] = ids[n].guardar();
            System.out.println( parses[n] );
        }
        
        // Genera el ID a partir de cada String
        System.out.println("\n" + "--PARSEAR--");
        ID[] nuevos = new ID[pruebas];
        int fallos = 0;
        for (int n = 0; n != pruebas; n++){
            nuevos[n] = ID.parseID( parses[n] );
            System.out.print(nuevos[n] + " & ");
            System.out.println( ids[n].equals(nuevos[n] ));
            if( !ids[n].equals(nuevos[n] ))
                ++fallos;
        }
        System.out.println("FALLOS: " + fallos);
    }
}
